package com.springboot.file.util.easyexcel.strategy;

import com.alibaba.excel.write.handler.SheetWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;

/**
 * 单行表头策略
 * 确保简单表头只在一行显示，后续行如果也是表头则隐藏
 */
@Slf4j
public class SingleRowHeaderStrategy implements SheetWriteHandler {

    @Override
    public void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
        // 创建前不做处理
    }

    @Override
    public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
        Sheet sheet = writeSheetHolder.getSheet();
        
        // 检查是否是简单表头（不超过1行）
        if (isSimpleHeader(sheet)) {
            // 如果有多行表头，只保留第一行，隐藏其他行
            hideExtraHeaderRows(sheet);
        }
    }
    
    /**
     * 判断是否为简单表头（只有一行的表头）
     */
    private boolean isSimpleHeader(Sheet sheet) {
        // 检查前两行，如果都是表头行但内容不同，则不是简单表头
        if (sheet.getLastRowNum() >= 1) {
            Row firstRow = sheet.getRow(0);
            Row secondRow = sheet.getRow(1);
            
            if (firstRow != null && secondRow != null) {
                // 检查第二行是否为空白行或全为空白单元格
                boolean secondRowEmpty = true;
                for (int i = 0; i < secondRow.getLastCellNum(); i++) {
                    Cell cell = secondRow.getCell(i);
                    if (cell != null && cell.getCellType() != CellType.BLANK) {
                        String value = getCellStringValue(cell);
                        if (!value.trim().isEmpty()) {
                            secondRowEmpty = false;
                            break;
                        }
                    }
                }
                
                // 如果第二行不是空行，则检查是否为数据行
                if (!secondRowEmpty) {
                    return !isDataRow(secondRow);
                }
            }
        }
        
        // 如果只有一行或第二行为空，则是简单表头
        return true;
    }
    
    /**
     * 判断是否为数据行
     */
    private boolean isDataRow(Row row) {
        // 数据行通常包含数字、日期等非文本内容
        boolean hasNumericCells = false;
        int textCellCount = 0;
        
        for (int i = 0; i < row.getLastCellNum(); i++) {
            Cell cell = row.getCell(i);
            if (cell != null) {
                if (cell.getCellType() == CellType.NUMERIC) {
                    hasNumericCells = true;
                } else if (cell.getCellType() == CellType.STRING) {
                    textCellCount++;
                }
            }
        }
        
        // 如果有数字单元格且文本单元格较少，可能是数据行
        return hasNumericCells && textCellCount < 3;
    }
    
    /**
     * 隐藏多余的表头行
     */
    private void hideExtraHeaderRows(Sheet sheet) {
        // 获取第一个可能的数据行索引
        int firstDataRowIndex = findFirstDataRowIndex(sheet);
        
        // 如果第一行和数据行之间有行，则这些行是多余的表头行
        if (firstDataRowIndex > 1) {
            for (int i = 1; i < firstDataRowIndex; i++) {
                Row row = sheet.getRow(i);
                if (row != null) {
                    // 如果行内容不为空，则隐藏此行
                    boolean isEmpty = true;
                    for (int j = 0; j < row.getLastCellNum(); j++) {
                        Cell cell = row.getCell(j);
                        if (cell != null && cell.getCellType() != CellType.BLANK) {
                            isEmpty = false;
                            break;
                        }
                    }
                    
                    if (!isEmpty) {
                        sheet.getRow(i).setZeroHeight(true); // 隐藏行
                        log.debug("隐藏了多余的表头行: {}", i);
                    }
                }
            }
        }
    }
    
    /**
     * 查找第一个数据行的索引
     */
    private int findFirstDataRowIndex(Sheet sheet) {
        for (int i = 1; i <= sheet.getLastRowNum(); i++) {
            Row row = sheet.getRow(i);
            if (row != null && isDataRow(row)) {
                return i;
            }
        }
        return sheet.getLastRowNum() + 1;
    }
    
    /**
     * 获取单元格的字符串值
     */
    private String getCellStringValue(Cell cell) {
        if (cell == null) return "";
        
        switch (cell.getCellType()) {
            case STRING:
                return cell.getStringCellValue();
            case NUMERIC:
                return String.valueOf(cell.getNumericCellValue());
            case BOOLEAN:
                return String.valueOf(cell.getBooleanCellValue());
            case FORMULA:
                return cell.getCellFormula();
            default:
                return "";
        }
    }
} 